import defineReactive from "./defineReactive.js"
import Dep from "./dep.js"
import observe from "./observe.js"
import protoArguments from "./protoArguments.js"
// 这一步主要是为了给对象设置响应式
export default function Observer(value) {
    // 为对象本身设置一个 dep，方便在更新对象本身时使用，比如 数组通知依赖更新时就会用到
    this.dep = new Dep()
    // 设置一个__ob__标识，这个值是this，用来标识已经做过响应式处理了
    // enumerable要设置为false，这样就并不会再对__ob__再添加响应式

    Object.defineProperty(value,'__ob__',{
        value:this,
        enumerable:false,
        writable:true,
        configurable:true
    })

    if (Array.isArray(value)) {
        // 数组的响应式
        protoArguments(value)
        this.observeArray(value)
    } else {
        // 对象的响应式
        this.walk(value)
    }

}


Observer.prototype.walk = function (obj) {
    // 遍历对象的每一个key，为这些key对应的值设置get和set

    for (let key in obj) {
        defineReactive(obj, key, obj[key])
    }

}
// 在这遍历数组的每一个元素，为每一个元素设置响应式

Observer.prototype.observeArray = function (arr){
    for(let item of arr){
        observe(item)
    }

}